package com.qf.controller;

import com.qf.entity.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public String login(String name,String password){
        System.out.println(name);
        System.out.println(password);

//        return "res1";  //默认转发
//        return "forward:/index.jsp";
        /*
            这里没有在路径前面加/，认为是一个相对路径,相对的是当前资源而言
            当前资源是：http://localhost/user/login,那么相对位置就是http://localhost/user
            此时我们跳转到index.jsp，他就认为是http://localhost/user/index.jsp

            这里如果在路径前面加了/,就是一个绝对路径，绝对路径是基于服务器路径而言的
            服务器路径：http://localhost
            此时我们跳转到/index.jsp,他就认为是http://localhost/index.jsp
         */
        return "redirect:/index.jsp";
    }

    /*
        http://localhost/user/time?date=2022/12/12（这种格式默认支持）
     */
    @RequestMapping("/time0")
    public String time0(Date date){

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dataStr = sdf.format(date);
        System.out.println(dataStr);

        return "res1";
    }


    /*
        http://localhost/user/time?date=2022/12/12（这种格式默认支持）
        浏览器访问这个控制器方法时，如果传递过来的日期格式是yyyy/MM/dd,是可以转换成功的，
            这种格式也是springmvc内部默认支持的字符串到日期对象的转换格式
        后期我们通过浏览器收集到的日志格式，多半情况下是yyyy-MM-dd这种格式。此时我们需要修改springmvc的默认转换格式。
        http://localhost/user/time?date=2022-12-12（这种格式默认不支持，需要利用注解修改格式）
     */
    @RequestMapping("/time")
    public String time(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dataStr = sdf.format(date);
        System.out.println(dataStr);

        return "res1";
    }

    /*
        http://localhost/user/time2?name=zs&pwd=123&birthday=2020-11-11

        如果数据直接封装到实体，那么需要在实体的日期属性上，通过DateTimeFormat注解改变默认格式
     */
    @RequestMapping("/time2")
    public String time2(User user){

        System.out.println(user);

        return "res1";
    }

    /*
        在实际开发中，我们有一种url的路径风格，将页面上传递到后台的参数，直接写在url路径中
        而不是通过？形式，拼接参数

        传统访问带参方式：/user/find?id=11
        路径参数带参方式：/user/find/11
     */
    @RequestMapping("/find/{id}")
    public String findById(@PathVariable Integer id){
        System.out.println("id = " + id);

        return "res2";
    }
    @RequestMapping("/find2/{uid}")
    public String findById2(@PathVariable("uid") Integer id){
        System.out.println("id = " + id);

        return "res2";
    }

    @RequestMapping("/find/{pageNum}/{pageSize}")
    public String findByPage(@PathVariable int pageNum,@PathVariable int pageSize
            ,@RequestHeader("User-Agent") String agent,@CookieValue("JSESSIONID") String sessionId){
        System.out.println("pageNum = " + pageNum);
        System.out.println("pageSize = " + pageSize);

        System.out.println(agent);
        System.out.println(sessionId);

        return "res1";
    }

    @RequestMapping("/request")
    public void request(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String name = req.getParameter("name");
        System.out.println(name);
        String header = req.getHeader("User-Agent");
        System.out.println(header);
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("JSESSIONID")){
                System.out.println(cookie.getValue());
            }
        }

        resp.getWriter().write("success~~");
    }

    /*
        RequestBody注解演示

            默认情况下，springmvc会对页面发送过来的key=value&key2=value2这种参数数据进行接收封装。
            而现在我们前台页面传递过来的参数是：{"name":"zhangsan","pwd":"123","birthday":"2022-12-12"}，
                这是一个json格式的数据，不是key=value&key2=value2形式，所以springmvc默认情况下无法接收封装

            @RequestBody这个注解就是告诉springmvc去接收json格式数据并封装。springmvc底层默认是基于Jackson进行
                json格式字符串和java对象的转换的。那么我们想让这个自动完成转换，必须将Jackson的依赖引入到项目中。
     */
    @RequestMapping("/regist")
    public String regist(@RequestBody User user){
        System.out.println(user);

        return "res1";
    }
}
